Le 17 février 2022

Plan du module

Ce cours est un TD d’introduction à la data science/visualisation. Pour ce faire, nous utiliserons un langage interprété de haut niveau statistique R et l’environnement de développement intégré (EDI fr, IDE en) Rstudio. Les différents points abordés durant ces 15 heures de cours sont:

source cours antérieur

  • Extraction et manipulation des données (data mining)
  • Représentations graphiques de vos données (data visualisation)
  • Valorisations de ces données par le biais de méthodes statistiques
  • Représentations graphiques interactives (html widget, plotly …)
  • Shiny et Rmarkdown création d’application et de rapport interactif (rapport TD à rendre idéalement sous .Rmd)

Plan du module

Evaluation :

source cours antérieur

  • choisir un sujet de data science en lien avec votre mémoire de fin d’étude par équipe de 2
  • rendre un rapport en format .Rmd (idéalement) de data mining et de data visualisation avec les fichiers sources associés (.csv, script .R, …)
  • Questionnaire (devoir sur table)

Plan de ce cours

Les 3 premières heures seront consacrées à une introduction sur la data science et des rappels sur R

  • Définition et cadre

Extraction et manipulation de données (data mining)

  • Principe de base de la data visualisation (infographie)

  • Rappels sur R

    • Objets R (variable, programme et fonction)
    • importer des données depuis le web
    • graphiques simples

Contexte

traitements d’informations exempleétude de texte résumés d’articles tirés d’un blog

#install.packages(c("tm", "SnowballC", "wordcloud", "RColorBrewer", "RCurl", "XML"))
source('http://www.sthda.com/upload/rquery_wordcloud.r')
res<-rquery.wordcloud("https://www.r-bloggers.com/", type ="url", lang = "english",excludeWords =tolower(c(month.name,"the","and","you","|")))

Une Réalité Big Data

https://www.seagate.com/fr/fr/our-story/data-age-2025

\[ 1 Zo \simeq 10^{12} Go \]

De 3500 avant J.C, jusqu’à l’an 2000 l’Homme a accumulé \(5\,000\,000\,000 Go \simeq 0.005 Zo\). En 2025, les projections annonce \(40 Zo\)

Méga Données ?

Définition Big Data

“Big data is a term that describes large volumes of high velocity, complex and variable data that require advanced techniques and technologies to enable the capture, storage, distribution, management, and analysis of the information.”

TechAmerica Foundation’s Federal Big Data Commission, 2012

Besoin d’analyse

library(readr)
library(ggplot2)
library(ggthemes)
multiTimeline <- read_csv("data/multiTimeline.csv",skip = 2)
multiTimeline$date <- paste0(multiTimeline$Mois,"-15")
ggplot2::ggplot(multiTimeline,aes(as.Date(date),multiTimeline$`Big data: (Dans tous les pays)`)) + geom_line(size=1) +
  geom_smooth(se = FALSE)+ theme_igray()+
  labs(x="Date",y="Recherche en %", title="Big Data",subtitle="Fréquence des recherches du mot Big Data depuis 2004",caption="https://trends.google.com/trends/explore?date=all&q=Big%20data")

des outils, méthodes …

Pourquoi R ?

  • Open source & Gratuit

  • Facile à installer sur les systèmes d’exploitations Linux, Windows et Apple

  • Une très grosse communauté de développeurs et d’utilisateurs

  • Facile à utiliser pour des non-programmeurs pour des calculs statistiques, prévisions (Deep, Machine Learning) …

  • Possibilité de créer des illustrations, applications web et même la présentation que vous lisez actuellement de façon automatique

    densité des coureurs à Paris utilisant une montre connecté

source cours 2017

Installation de R et de Rstudio

Data visualisation

Définition

  • communiquer des données de façon visuelle

  • transformer des données en information

  • résultats graphiques clairs et compréhensibles

Exemple

Principes d’infographie

  • mémoire courte quelques secondes d’attention ou de réflexion

  • un max de \(\simeq 11\) types de couleurs ou de styles différents facilement distinguables

  • notion de perspective données et vérités

  • source “How to Lie With Statistics”, 1954, Huff

Science sous jacente les statistiques

source “How to Lie With Statistics”, 1954, Huff

Mathématiques, géométrie et données

sous-jacentes déterminent l’allure du graphique et influence le lecteur

Mathématiques, géométrie et données

Un graphe une histoires dif.

Pour rappel, Clinton a perdu l’élection 242 “county” contre 2,232 pour Trump. Cependant, au vote populaire Clinton passe devant Trump avec respectivement 50.5% et 49.5% des votes en sa faveur.

Un graphique vaut mille mots

Combien y a t il de A ?

ggplot(df,aes(x=x,y=y,colour=test,size=test))+geom_text(aes(label=lettres))+labs(colour="",size="")+scale_color_manual(values = c("red","black"))+scale_size_manual(values = c(6.5,4))

  • Réponse : 9

Installation de R

Pour être bon en R …

  • savoir demander de l’aide une qualité essentielle d’un programmeur

    • stack overflow forum en ligne
    • suivre des exemples R blogger, git_hub …
    • commandes en console R ?? et ?
    • utiliser un environnement de travail intégré (IDE) comme Rstudio (facilite la programmation, auto indentation, variables historiques, etc …)

Présentation de l’IDE Rstudio

Codes sources, programmes et scripts

Codes sources, programmes et scripts

  • créer un fichier texte hello.R
  • écrire votre premier programme en R
#  le Diése sert à commenter le reste de la la ligne  
# tout ce qui est écrit ici ne sera pas exécuté par R  
# indiquer le but du programme ou toutes autres informations  
# Nom  et Prénom dates 
a <- "hello World ! "
b = pi
print(a)
print(paste("pi is equal to",b))

Comment l’exécuter ?

A l’aide de la console R :

source("cours_data_visualisation/hello.R")
## [1] "hello World ! "

L’environnement de R

Ce qui a changé

  • Ajout de la commande lancée dans l’historique
  • Ajout des variables a et b dans l’environnement R (commande ls() pour lister les objets)

Les variables dans R

class(a)
## [1] "character"
b <- 1 
class(b)
## [1] "numeric"
#vecteurs
c <- c(1,2,3,4)
d <- c("a","b","c","d")
e <- c("a"=1,"b"=2,"c"=3,"d"=4)
f <- c(1,"a","d",4)

Les vecteurs

length(x = c)
## [1] 4
names(x=e)
## [1] "a" "b" "c" "d"
# accéder à un élement
c[1]
## [1] 1
e["a"]
## a 
## 1
# ou plusieurs
c[1:2]
## [1] 1 2
e[c("a","c")]
## a c 
## 1 3
c = [1,2,3,4]
len(c)
## 4

Les facteurs

ff<-factor(1:10)

f <- factor(1:10,levels = seq(from = 10,to = 1,by = -1))

ff
##  [1] 1  2  3  4  5  6  7  8  9  10
## Levels: 1 2 3 4 5 6 7 8 9 10
f
##  [1] 1  2  3  4  5  6  7  8  9  10
## Levels: 10 9 8 7 6 5 4 3 2 1
as.numeric(as.character(ff))
##  [1]  1  2  3  4  5  6  7  8  9 10
as.numeric(ff)
##  [1]  1  2  3  4  5  6  7  8  9 10

et les classes

class(c)
## [1] "numeric"
class(d)
## [1] "character"
class(e)
## [1] "numeric"
class(f)
## [1] "factor"

attention f ne pas mélanger les types de variables

Les Matrices

f.m <- cbind(f)
f.m
##        f
##  [1,] 10
##  [2,]  9
##  [3,]  8
##  [4,]  7
##  [5,]  6
##  [6,]  5
##  [7,]  4
##  [8,]  3
##  [9,]  2
## [10,]  1
c.m <- cbind(c)
c.m
##      c
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4

Matrices numériques ou caractères

m.m <- cbind(f.m,f.m)
m.m
##        f  f
##  [1,] 10 10
##  [2,]  9  9
##  [3,]  8  8
##  [4,]  7  7
##  [5,]  6  6
##  [6,]  5  5
##  [7,]  4  4
##  [8,]  3  3
##  [9,]  2  2
## [10,]  1  1
n.m <- cbind(c.m,c.m)
n.m
##      c c
## [1,] 1 1
## [2,] 2 2
## [3,] 3 3
## [4,] 4 4

Matrices et Data frames

mat <- matrix(data = rep(c.m,3), ncol=3,nrow = 4)
mat
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    2    2    2
## [3,]    3    3    3
## [4,]    4    4    4
df = data.frame("numeriques"= 1:4, lettres=c("A","B","C","D"),stringsAsFactors = F)
df 
##   numeriques lettres
## 1          1       A
## 2          2       B
## 3          3       C
## 4          4       D

Matrices et Data frames

class(mat[,1])
## [1] "numeric"
class(df[,"numeriques"])
## [1] "integer"
class(df[,"lettres"])
## [1] "character"

Matrices Vs Data frames

Quelle est l’avantange d’une matrice par rapport à une data frame ?

Passer d’un type à l’autre

as.matrix(df)
##      numeriques lettres
## [1,] "1"        "A"    
## [2,] "2"        "B"    
## [3,] "3"        "C"    
## [4,] "4"        "D"
as.numeric(f)
##  [1] 10  9  8  7  6  5  4  3  2  1

Relation logique

1==0
## [1] FALSE
1>=0
## [1] TRUE
1<=0
## [1] FALSE
"a" == "b"
## [1] FALSE

Fonctions

les commandes matrix(), cbind(), data.frame() sont des fonctions codées

Définition

  • un objet R
  • des commandes R écrites dans un fichier qui effectuent une tâche prédéfinie
  • permet de faire automatiquement la même tâche plusieurs fois
  • garder un programme plus lisible
  • un gain de temps à long terme

Ecrire votre première fonction

écrire le même code que précédemment (page 27 de la présentation) sous forme de fonction dans un nouveau fichier hello_fun.R

hello <-function(texte=NULL){   # argument ou données d'entrées

  #code manipulant les données d'entrée
 
return(texte)  #  return  renvoie le résultat de la fonction  
}
 source("cours_data_visualisation/hello_fun.R")

 hello("hello world !")
## [1] "hello world !"

Un peu plus compliqué

Un petit ajout le nom de l’utilisateur

hello <-function(texte=NULL){  
  #on souhaite coller le nom de l'utilisateur à "hello world"
  # on récupére le nom de l'utilisateur 
 nom <- Sys.getenv("USERNAME") # fonction trouvée via une recherche web
   # on colle le nom de l'utilisateur
 texte <- paste(texte,"and",nom)
 
return(texte)  #  return  renvoie le résultat de la fonction  
}

 # source("cours_data_visualisation/hello_fun2.R")

 hello("hello world")
## [1] "hello world and Laurent"

Fonction cor()

Vous avez écrit une fonction comme les fonctions de base de R, comme par exemple cor() qui calcule la corrélation des données de deux vecteurs ou des données contenues dans une matrice

nrow
## function (x) 
## dim(x)[1L]
## <bytecode: 0x0000000014f5c890>
## <environment: namespace:base>
?cor
## starting httpd help server ... done
cor(rnorm(n = 100,mean = 1,sd = 0.25),rnorm(n = 100,mean = 1,sd = 25))
## [1] -0.108202

Les boucles

Calculer \(n!\) avec \(n=10\).

factorielle <-1
for (i in seq(1, 10)){
  factorielle <- factorielle*i
}
print(factorielle)
## [1] 3628800

\[ n! = \prod_{1\leqslant i\leqslant n} i = 1\times 2\times 3\times \ldots \times (n-1) \times n. \]

Vérification

On vérifie avec la fonction déjà codée.

\[ \Gamma(n) = (n-1)!\qquad n \in \mathbb{N}_0 \]

factorial(10)
## [1] 3628800

Importer des données

Importer des données sous R

Import Dataset > from Local File

Puis vérifier que les données sont sous le bon format

Importer des données sous console R

#install.packages("Quandl")
# library(Quandl)
# Quandl("CITYPOP/CITY_ANGERSPAYFRANCE")
library(readr)

angers_pop <- read_delim("https://raw.githubusercontent.com/LaurentPolitis/Cours_FIN403/master/Cours_1/data/angers_pop.csv", "\t", escape_double = FALSE, trim_ws = TRUE)
## 
## -- Column specification --------------------------------------------------------
## cols(
##   Year = col_date(format = ""),
##   Population = col_number()
## )
class(angers_pop)
## [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"

Visualiser les données

INSEE.29_000067684_A <- angers_pop
View(INSEE.29_000067684_A)

Visualiser les données

plot(x = as.Date(INSEE.29_000067684_A$Year),y=
       INSEE.29_000067684_A$Population)

Changer le style du graphe

plot(x = as.Date(INSEE.29_000067684_A$Year),y=
       INSEE.29_000067684_A$Population,type = "l")

Changer le style du graphe

plot(x = as.Date(INSEE.29_000067684_A$Year),y=
       INSEE.29_000067684_A$Population,type = "b")

Légendes

plot(x = as.Date(INSEE.29_000067684_A$Year),y=
       INSEE.29_000067684_A$Population,type = "l",xlab ="Dates" ,
     ylab="populations")

C’était l’outil classique de création de graphe de R “plot()”. Le prochain cours je vous présenterais “la grammaire graphique” avec ggplot2.

Introduction ggplot

Les graphiques que nous allons créer aujourd’hui sont :

  • Les boites à moustaches
  • Les histogrammes
  • Les courbes de densité
  • Nuage de points, séries temporelles et graphiques diagnostics de modélisation statistiques…

Rappel Data mining

Les données utilisées sont la population des communes de 1968 à 2012 :

http://www.insee.fr/

La fonction ci-dessous permet de la télécharger.

# setwd("~/data-visualisationFIN403/") # pour se placer dans le répertoire courant 

source("https://raw.githubusercontent.com/LaurentPolitis/Cours_FIN403/master/Cours_1/cours_data_visualisation/data_mining_communes.R") # charge la fonction data_import()
## 
## -- Column specification --------------------------------------------------------
## cols(
##   .default = col_double(),
##   LIBGEO = col_character()
## )
## i Use `spec()` for the full column specifications.
## Warning: 720 parsing failures.
##   row    col               expected actual                                                                                                file
## 11156 CODGEO no trailing characters  2A001 'https://raw.githubusercontent.com/LaurentPolitis/Data_Viz_Fin403/master/data/population_ville.csv'
## 11156 DEP    no trailing characters  2A    'https://raw.githubusercontent.com/LaurentPolitis/Data_Viz_Fin403/master/data/population_ville.csv'
## 11157 CODGEO no trailing characters  2A004 'https://raw.githubusercontent.com/LaurentPolitis/Data_Viz_Fin403/master/data/population_ville.csv'
## 11157 DEP    no trailing characters  2A    'https://raw.githubusercontent.com/LaurentPolitis/Data_Viz_Fin403/master/data/population_ville.csv'
## 11158 CODGEO no trailing characters  2A006 'https://raw.githubusercontent.com/LaurentPolitis/Data_Viz_Fin403/master/data/population_ville.csv'
## ..... ...... ...................... ...... ...................................................................................................
## See problems(...) for more details.
## 
## -- Column specification --------------------------------------------------------
## cols(
##   CODGEO = col_character(),
##   `Code géographique` = col_character(),
##   `Code du département suivi du numéro de commune ou du numéro d'arrondissement municipal` = col_character()
## )
## 
## -- Column specification --------------------------------------------------------
## cols(
##   new_code = col_character(),
##   new_name = col_character(),
##   former_code = col_character(),
##   former_name = col_character()
## )
View(population_ville)

GGplot

Une librairie R de visualisation de données développée par Hadley Wickham en 2005 selon les principes énoncés par Leland Wilkinson dans son ouvrage The Grammar of Graphics

  • Plot = data + Aesthetics + Geometry
  • Aesthetics (aes) : les couleurs, les tailles, les formes, les labels mais aussi les données en x et en y
  • Geometry (geom_ …) va regrouper les options concernant les types de graphique (line, point, histogramme, heatmap, boxplot, etc.)
  • peut-être stocké dans l’objet
#install.packages(ggplot2)
library(ggplot2)

Les boites à moustaches

  • moyen rapide de résumer une série statistique quantitative
  • inventée en 1977 par John Tukey
library(ggplot2)
ggplot(population_ville) + geom_boxplot(aes(x="France",y= `Population en 2012 (princ)` ))

Les boites à moustaches exemple

Modifier l’échelle des axes

ggplot(population_ville) + geom_boxplot(aes(`Population en 2012 (princ)`,x="ville"))+
 scale_y_sqrt()

Echelle en log

ggplot(population_ville) + geom_boxplot(aes(`Population en 2012 (princ)`,x="ville")) +
 scale_y_log10()

Faire ressortir la ville d’Angers

ggplot(population_ville) + geom_boxplot(aes(y=`Population en 2012 (princ)`,x="France"))+ 
scale_y_log10() + geom_point(data= population_ville[population_ville$Communes=="Angers",],
                             aes(y = `Population en 2012 (princ)` ,x='France'),color="red",size=4)

Sans GGplot

boxplot(population_ville$`Population en 2012 (princ)`,log="y", ylim=c(100,100000000))

Par régions

ggplot(population_ville) + geom_boxplot(aes(y=(`Population en 2012 (princ)`),x=Region,group=Region))+
  scale_y_log10() + coord_flip()

Mettre en valeur deux sous classes de région

population_ville$dom_tom = population_ville$Region %in% 
  c("Martinique","Guyane","Guadeloupe","Martinique","La Réunion")
p = ggplot(population_ville,aes(y=`Population en 2012 (princ)`,x=Region,group=Region)) +  scale_y_log10() + 
  coord_flip()
 p+ geom_boxplot(aes(fill=dom_tom))

Des Box plots plus exotiques

p + geom_violin()

Des Box plots plus exotiques

p  +geom_jitter(alpha=0.1) + geom_boxplot(alpha=0.7)

Courbe de densité de probabilité

ggplot(population_ville) + geom_density(aes(x = `Population en 2012 (princ)`)) 

Echelles

ggplot(population_ville) + geom_density(aes(x = `Population en 2012 (princ)`)) +scale_x_log10()

plusieurs graphes en un même

ggplot(population_ville) + geom_density(aes(x = `Population en 2012 (princ)`,
                                            fill="kernel density \n estimation")) +
  scale_x_log10() +facet_wrap(facets=~Region)

Les histogrammes

ggplot(population_ville,aes(x=`Population en 2012 (princ)`)) + geom_histogram(binwidth = 10000)

Zoom sur une région

ggplot(population_ville[population_ville$Region=="Bretagne",],aes(x=`Population en 2012 (princ)`,fill=Communes)) +
  geom_histogram(binwidth = 1000) +
  scale_y_sqrt()+facet_wrap(facets = ~Communes)

Les séries temporelles

library(reshape2)
tmp=population_ville[population_ville$Region=="Bretagne",c(4:10)]
tmp.m=melt(tmp)
tmp.m$variable=as.numeric(substr(x = tmp.m$variable,15,18))
colnames(tmp.m)[1] = "Communes"
ggplot(tmp.m) + geom_line(aes(x=as.Date(paste(tmp.m$variable,"-01-01",sep="")),y=value,group=Communes))+scale_y_log10()+labs(x="Date")

Smooth

library(reshape2)
tmp=population_ville[population_ville$Region=="Bretagne",c(4:10)]
tmp.m=melt(tmp)
tmp.m$variable=as.numeric(substr(x = tmp.m$variable,15,18))
colnames(tmp.m)[1] = "Communes"
ggplot(tmp.m) + geom_smooth(aes(x=as.Date(paste(tmp.m$variable,"-01-01",sep="")),y=value,group=Communes),color="black")+scale_y_log10()+labs(x="Date")

rendre visible le graphique

tmp.m$Vannes=tmp.m$Communes=="Vannes" #"#CFCDCD", "#FFFFFF"

tmp.m=tmp.m[tmp.m$value>15000,]

ggplot(tmp.m) + geom_line(aes(x=as.Date(paste(tmp.m$variable,"-01-01",sep="")),
                              y=value,group=Communes,color=Vannes,size=Vannes)
                         )+

scale_color_manual(values=c("#5E5C57", "red"))+
  scale_size_manual(values=c(1, 3))+
  geom_text(data=tmp.m[tmp.m$variable==2012,],aes(x = as.Date(paste(2012,"-01-01",sep=""))
,y=(value),label=Communes))

souligné

## Warning: Use of `tmp.m$variable` is discouraged. Use `variable` instead.

Graphiques et modélisation

ggplot(data = tmp.m[tmp.m$Communes=="Vannes",], aes(x = variable,  y =value)) +
  geom_point() +geom_smooth(se = F)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Tendances à la hausse

ggplot(data = tmp.m[tmp.m$Communes=="Vannes",], aes(x = variable,  y =value)) +
  geom_point() +geom_smooth(method = "lm")
## `geom_smooth()` using formula 'y ~ x'